#!/usr/bin/env python
# -*- coding: utf-8 -*-


import math

#Класс сота
class GSMCell:
    def __init__(self,latitude,longitude,radius,delta,azimuth,angle):
	self.latitude = latitude
	self.longitude = longitude
	self.radius = radius
	self.delta = delta
	self.azimuth = azimuth
	self.angle = angle

    def rvpis(self): 
	return rvpis(self)
	
    def ropis(self): 
	return ropis(self)

#Класс единичной точки GPS координат
class GPSPoint:
    def __init__(self,latitude,longitude):
	self.latitude = latitude
	self.longitude = longitude

    def toMeter(self):
	return gpspoint_to_gpsmeter(self)


    def toPoint(self):
	return gpsmeter_to_gpspoint(self)


#Расчитать центер соты
def center_of_gsmcell(sota):
    k_Lat = 111174.0
    k_Lon = 111575.0 * math.cos( (sota.latitude * math.pi) / 180.0)
    # Преобразование Широты и долгиты в метры
    m_Lat = sota.latitude * k_Lat
    m_Lon = sota.longitude * k_Lon
    # Перевод углов в радианы
    azimuth_rad = (sota.azimuth * math.pi) / 180.0
    angle_rad = (sota.angle * math.pi)/180.0
    # Нахождение центра сектора
    H_cs_metr = m_Lat + (sota.radius * math.cos(azimuth_rad)) # Новые типа работают !
    D_cs_metr = m_Lon + (sota.radius * math.sin(azimuth_rad))															                
    return GPSPoint(H_cs_metr / k_Lat, D_cs_metr / k_Lon)


def rvpis(sota):
    #Установка коэфиц. поправки широты и долготы (перевод в метры)	
    k_Lat = 111174.0
    k_Lon = 111575.0 * math.cos((sota.latitude * math.pi) / 180.0)
    # Преобразование Широты и долгиты в метры
    m_Lat = sota.latitude * k_Lat
    m_Lon = sota.longitude * k_Lon
    # Перевод углов в радианы
    azimuth_rad = (sota.azimuth * math.pi) / 180.0
    angle_rad = (sota.angle * math.pi) / 180.0
    # Нахождение центра сектора
    H_cs_metr = m_Lat + (sota.radius * math.cos(azimuth_rad)) # Новые типа работают !
    D_cs_metr = m_Lon + (sota.radius * math.sin(azimuth_rad))
    return sota.radius * math.tan(angle_rad /2.0)


def ropis(sota):
    #Установка коэфиц. поправки широты и долготы (перевод в метры)	
    k_Lat = 111174.0
    k_Lon = 111575.0 * math.cos((sota.latitude * math.pi) / 180.0)
    # Преобразование Широты и долгиты в метры
    m_Lat = sota.latitude * k_Lat
    m_Lon = sota.longitude * k_Lon
    # Перевод углов в радианы
    azimuth_rad = (sota.azimuth * math.pi) / 180.0
    angle_rad = (sota.angle * math.pi) / 180.0
    # Нахождение центра сектора
    H_cs_metr = m_Lat + (sota.radius * math.cos(azimuth_rad)) # Новые типа работают !
    D_cs_metr = m_Lon + (sota.radius * math.sin(azimuth_rad))
    r_vpis = sota.radius * math.tan(angle_rad /2.0)
    return math.sqrt(math.pow(sota.delta,2) + math.pow(r_vpis + sota.delta * math.tan(angle_rad / 2),2))

    
#Преобразование точки Широта/Долгота в метры от 0-ого меридиана
#этот метод работает не точно, для более точных расчетов необходимо использовать меркатор
def gpspoint_to_gpsmeter(point):
    #Установка коэфиц. поправки широты и долготы (перевод в метры)	
    k_Lat = 111174.0
    k_Lon = 111575.0 * math.cos((point.latitude * math.pi) / 180.0)
    m_Lat = point.latitude * k_Lat
    m_Lon = point.longitude * k_Lon
    return  GPSPoint(m_Lat, m_Lon)


#Преобразование точки Широта/Долгота в метры от 0-ого меридиана с использованием общей точки привязки.
#этот метод работает не точно, для более точных расчетов необходимо использовать меркатор
def gpspoint_to_gpsmeter_c(point,point_of_meter_control):
    #Установка коэфиц. поправки широты и долготы (перевод в метры)	
    k_Lat = 111174.0
    k_Lon = 111575.0 * math.cos((point_of_meter_control.latitude * math.pi) / 180.0)
    m_Lat = point.latitude * k_Lat
    m_Lon = point.longitude * k_Lon
    return  GPSPoint(m_Lat, m_Lon)


#Преобразование метровой точки в широту и долготу  с использованием общей точки привязки.
#этот метод работает не точно, для более точных расчетов необходимо использовать меркатор
def gpsmeter_to_gpspoint_c(meter,point_of_meter_control):
     k_Lat = 111174.0
     #Преобразование Широты и долгиты в градусы
     m_Lat = meter.latitude / k_Lat
     k_Lon = 111575.0 * math.cos((point_of_meter_control * math.pi) / 180.0)
     m_Lon = meter.MLongtitude / k_Lon
     return GPSPoint(m_Lat, m_Lon)


#Преобразование метровой точки в широту и долготу
#этот метод работает не точно, для более точных расчетов необходимо использовать меркатор
def gpsmeter_to_gpspoint(meter):
     k_Lat = 111174.0
     #Преобразование Широты и долгиты в градусы
     m_Lat = meter.latitude / k_Lat
     k_Lon = 111575.0 * math.cos((m_Lat * math.pi) / 180.0)
     m_Lon = meter.MLongtitude / k_Lon
     return GPSPoint(m_Lat, m_Lon)

#Расчет расстояния между двумя метровыми точками (результат в метрах)
def lenMeter(meter1,meter2):
    return math.sqrt(math.pow(meter1.latitude-meter2.latitude,2)+math.pow(meter1.longitude-meter2.longitude,2))

#Расчет расстояния между двумя GPS точками (результат в метрах)
def lenPoint(point1,point2):
    return lenMeter(gpspoint_to_gpsmeter(point1),gpspoint_to_gpsmeter(point2))


def main():
    cell = GSMCell(47,39,100,10,1,65)
    point = center_of_gsmcell(cell)
    
    print point.latitude
    print cell.rvpis()
    print cell.ropis()



if (__name__ == "__main__"):
    main()
